package gf

import (
	"io/fs"
	"os"

	"gitee.com/liumou_site/logger"
)

// Mkdir 创建一个目录及其所有父目录，如果目录已存在或涉及的文件名已存在且为目录，则不执行创建操作
// 参数:
//
//	dir: 需要创建的目录路径
//	mode: 新创建目录的权限模式
func (fi *FileStatus) Mkdir(dir string, mode fs.FileMode) {
	// 设置当前操作的文件名或目录名为待创建的目录
	fi.FileName = dir

	// 检查当前操作对象是否为目录
	fi.IsDir()

	// 如果当前操作对象已经是目录，则记录日志并返回，无需创建
	if fi.IsDirs {
		logger.Info("文件夹已存在: ", dir)
		return
	}

	// 检查当前操作对象是否为文件
	fi.IsFile()

	// 如果没有错误且对象为文件，则记录警告日志并返回，因为不能用文件名创建目录
	if fi.Err == nil {
		logger.Warn("这是一个文件: %s", dir)
		return
	}

	// 尝试创建目录及其所有父目录，并设置相应的权限模式
	fi.Err = os.MkdirAll(dir, mode)

	// 如果创建过程中出现错误，则保留错误信息
	if fi.Err != nil {
		return
	}
}

// 写入文本到文件中,当文件已存在则覆盖,当文件不存在则创建,默认权限: 0644
func (fi *FileStatus) textCover(text string) {
	// os.O_CREATE 创建方式打开文件，文件不存在时会创建文件。
	// os.O_RDWR 读写方式打开，即可读也可写。
	fi.open, fi.Err = os.OpenFile(fi.FileName, os.O_WRONLY|os.O_APPEND|os.O_CREATE, fi.Perm)
	// 关闭文件
	defer func(file *os.File) {
		err := file.Close()
		fi.Err = err
		if err != nil {
			logger.Error(fi.Err)
			return
		}
	}(fi.open)
	if fi.Err != nil {
		logger.Error(fi.Err)
		return
	}

	_, fi.Err = fi.open.WriteString(text)
	if fi.Err != nil {
		logger.Error(fi.Err)
		return
	}
}

// Close is a method of the FileStatus type, used to close a file that may be open.
// This method checks if there is an open file handle, and if so, attempts to close it.
// After successfully closing, it sets the file handle to nil to indicate that the file is closed.
func (fi *FileStatus) Close() {
	// Check if there is an open file handle
	if fi.open != nil {
		// Attempt to close the file handle
		err := fi.open.Close()
		// If an error occurs while closing, terminate the method early
		if err != nil {
			return
		}
		// After successfully closing, set the file handle to nil
		fi.open = nil
	}
}

// CreateFile 创建文件
// 如果文件不存在，该方法会创建一个新文件
func (fi *FileStatus) CreateFile() {
	fi.Exists() // 判断文件是否存在
	if fi.Err != nil {
		// 尝试创建文件
		fi.open, fi.Err = os.Create(fi.FileName)
		// 关闭文件
		defer func(file *os.File) {
			fi.Err = file.Close()
			if fi.Err != nil {
				return
			}
		}(fi.open)
		if fi.Err != nil {
			logger.Error(fi.Err)
			return
		}
	}

	logs.Info("文件创建成功: ", fi.FileName)
}
